/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode() {}
 *     ListNode(int val) { this.val = val; }
 *     ListNode(int val, ListNode next) { this.val = val; this.next = next; }
 * }
 */
//2. 两数相加
//给你两个 非空 的链表，表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的，并且每个节点只能存储 一位 数字。
//
//请你将两个数相加，并以相同形式返回一个表示和的链表。
//
//你可以假设除了数字 0 之外，这两个数都不会以 0 开头。
//
//
//
//示例 1：
//
//
//输入：l1 = [2,4,3], l2 = [5,6,4]
//输出：[7,0,8]
//解释：342 + 465 = 807.
//示例 2：
//
//输入：l1 = [0], l2 = [0]
//输出：[0]
//示例 3：
//
//输入：l1 = [9,9,9,9,9,9,9], l2 = [9,9,9,9]
//输出：[8,9,9,9,0,0,0,1]
 //考虑l1 和l2长度关系
 //以及末位进位
class Solution {
    public ListNode addTwoNumbers(ListNode l1, ListNode l2) {
        ListNode head1=l1;
        ListNode head2=l2;
        //以head1为基准将l2的值添加到l1中
        //这一块就是l1长度大于ll2长度,不会有什么问题
        while(head1!=null){
            if(head2!=null){
                head1.val+=head2.val;
                head2=head2.next;
            }
            //如果此时l1已经遍历完了,但是l2没有遍历完,那么就就把l2的值添加到l1
            if(head1.next==null&&head2!=null){
                head1.next=head2;
                break;
            }
            head1=head1.next;
        }
        merge(l1);
            return  l1;

    }
        public  void merge(ListNode head){
            while(head!=null){
            if(head.val>=10){
                head.val=head.val%10;
                //进位问题,如果末尾没有下一位了,再创建新的一位+1
                //123   129,就符合上述的情况
                if(head.next==null){
                    head.next=new ListNode(0);
                }
                head.next.val+=1;
            }
            head=head.next;
            }
        }
    }
